package weixin

import (
	"github.com/astaxie/beego/logs"
	"encoding/json"
	"strings"
)

// 自定义菜单创建接口
// 自定义菜单能够帮助公众号丰富界面，让用户更好更快地理解公众号的功能。开启自定义菜单后，公众号界面如图所示：
//
// 请注意：
// 1、自定义菜单最多包括3个一级菜单，每个一级菜单最多包含5个二级菜单。
// 2、一级菜单最多4个汉字，二级菜单最多7个汉字，多出来的部分将会以“...”代替。
// 3、创建自定义菜单后，菜单的刷新策略是，在用户进入公众号会话页或公众号profile页时，如果发现上一次拉取菜单的请求在5分钟以前，就会拉取一下菜单，如果菜单有更新，就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注，则可以看到创建后的效果。
// 自定义菜单接口可实现多种类型按钮，如下：
// 1、click：点击推事件用户点击click类型按钮后，微信服务器会通过消息接口推送消息类型为event的结构给开发者（参考消息接口指南），并且带上按钮中开发者填写的key值，开发者可以通过自定义的key值与用户进行交互；
// 2、view：跳转URL用户点击view类型按钮后，微信客户端将会打开开发者在按钮中填写的网页URL，可与网页授权获取用户基本信息接口结合，获得用户基本信息。
// 3、scancode_push：扫码推事件用户点击按钮后，微信客户端将调起扫一扫工具，完成扫码操作后显示扫描结果（如果是URL，将进入URL），且会将扫码的结果传给开发者，开发者可以下发消息。
// 4、scancode_waitmsg：扫码推事件且弹出“消息接收中”提示框用户点击按钮后，微信客户端将调起扫一扫工具，完成扫码操作后，将扫码的结果传给开发者，同时收起扫一扫工具，然后弹出“消息接收中”提示框，随后可能会收到开发者下发的消息。
// 5、pic_sysphoto：弹出系统拍照发图用户点击按钮后，微信客户端将调起系统相机，完成拍照操作后，会将拍摄的相片发送给开发者，并推送事件给开发者，同时收起系统相机，随后可能会收到开发者下发的消息。
// 6、pic_photo_or_album：弹出拍照或者相册发图用户点击按钮后，微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
// 7、pic_weixin：弹出微信相册发图器用户点击按钮后，微信客户端将调起微信相册，完成选择操作后，将选择的相片发送给开发者的服务器，并推送事件给开发者，同时收起相册，随后可能会收到开发者下发的消息。
// 8、location_select：弹出地理位置选择器用户点击按钮后，微信客户端将调起地理位置选择工具，完成选择操作后，将选择的地理位置发送给开发者的服务器，同时收起位置选择工具，随后可能会收到开发者下发的消息。
// 9、media_id：下发消息（除文本消息）用户点击media_id类型按钮后，微信服务器会将开发者填写的永久素材id对应的素材下发给用户，永久素材类型可以是图片、音频、视频、图文消息。请注意：永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
// 10、view_limited：跳转图文消息URL用户点击view_limited类型按钮后，微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL，永久素材类型只支持图文消息。请注意：永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
// 请注意，3到8的所有事件，仅支持微信iPhone5.4.1以上版本，和Android5.4以上版本的微信用户，旧版本微信用户点击后将没有回应，开发者也不能正常接收到事件推送。9和10，是专门给第三方平台旗下未微信认证（具体而言，是资质认证未通过）的订阅号准备的事件类型，它们是没有事件推送的，能力相对受限，其他类型的公众号不必使用。
// 接口调用请求说明
// http请求方式：POST（请使用https协议） https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

// 个性化菜单接口
// 为了帮助公众号实现灵活的业务运营，微信公众平台新增了个性化菜单接口，开发者可以通过该接口，让公众号的不同用户群体看到不一样的自定义菜单。该接口开放给已认证订阅号和已认证服务号。
// 开发者可以通过以下条件来设置用户看到的菜单：
// 1、用户标签（开发者的业务需求可以借助用户标签来完成）
// 2、性别
// 3、手机操作系统
// 4、地区（用户在微信客户端设置的地区）
// 5、语言（用户在微信客户端设置的语言）
// 个性化菜单接口说明：
// 1、个性化菜单要求用户的微信客户端版本在iPhone6.2.2，Android 6.2.4以上，暂时不支持其他版本微信
// 2、菜单的刷新策略是，在用户进入公众号会话页或公众号profile页时，如果发现上一次拉取菜单的请求在5分钟以前，就会拉取一下菜单，如果菜单有更新，就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注，则可以看到创建后的效果
// 3、普通公众号的个性化菜单的新增接口每日限制次数为2000次，删除接口也是2000次，测试个性化菜单匹配结果接口为20000次
// 4、出于安全考虑，一个公众号的所有个性化菜单，最多只能设置为跳转到3个域名下的链接
// 5、创建个性化菜单之前必须先创建默认菜单（默认菜单是指使用普通自定义菜单创建接口创建的菜单）。如果删除默认菜单，个性化菜单也会全部删除
// 6、个性化菜单接口支持用户标签，请开发者注意，当用户身上的标签超过1个时，以最后打上的标签为匹配
// 个性化菜单匹配规则说明：
// 个性化菜单的更新是会被覆盖的。
// 例如公众号先后发布了默认菜单，个性化菜单1，个性化菜单2，个性化菜单3。那么当用户进入公众号页面时，将从个性化菜单3开始匹配，如果个性化菜单3匹配成功，则直接返回个性化菜单3，否则继续尝试匹配个性化菜单2，直到成功匹配到一个菜单。
// 根据上述匹配规则，为了避免菜单生效时间的混淆，决定不予提供个性化菜单编辑API，开发者需要更新菜单时，需将完整配置重新发布一轮。
const (
	//菜单的响应动作类型
	MENU_TYPE_VIEW        = "view"        //网页类型
	MENU_TYPE_CLICK       = "click"       //表示点击类型，
	MENU_TYPE_MINIPROGRAM = "miniprogram" //表示小程序类型
	ACCESS_TOKENS         = "ACCESS_TOKEN"
	MENU_SEARCH_URL       = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=%s"    //http请求方式：GET
	MENU_CREATE_URL       = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s" //http请求方式：POST（请使用https协议）

)

type Button struct {
	Type       string  `json:"type,omitempty"`        //菜单的响应动作类型，view表示网页类型，click表示点击类型，miniprogram表示小程序类型
	Name       string   `json:"name"`                 //菜单标题，不超过16个字节，子菜单不超过60个字节
	Key        string   `json:"key,omitempty"`        //菜单KEY值，用于消息接口推送，不超过128字节
	Url        string   `json:"url,omitempty"`        //网页链接，用户点击菜单可打开链接，不超过1024字节。type为miniprogram时，不支持小程序的老版本客户端将打开本url。
	media_id   string   `json:"media_id,omitempty"`   //调用新增永久素材接口返回的合法media_id
	Appid      string   `json:"appid,omitempty"`      //小程序的appid（仅认证公众号可配置）
	Pagepath   string  `json:"pagepath,omitempty"`    //小程序的页面路径
	Sub_button []Button `json:"sub_button,omitempty"` //二级菜单数组，个数应为1~5个
}

type MenuMsg struct {
	Button    []Button `json:"button"`
	Matchrule *MatchRule `json:"matchrule,omitempty"`
	Menuid    int64 `json:"menuid,omitempty"`
}

type MatchRule struct {
	Group_id             int64 `json:"group_id,omitempty"`
	Sex                  int64 `json:"sex,omitempty"`
	Country              string `json:"country,omitempty"`
	Province             string `json:"province,omitempty"`
	City                 string    `json:"city,omitempty"`
	Client_platform_type int64 `json:"client_platform_type,omitempty"`
}
type Menu struct {
	Menu            MenuMsg `json:"menu"`
	Conditionalmenu []MenuMsg `json:"conditionalmenu"`
}

func Json2Menu(input []byte) (menu *Menu) {
	logs.Debug("转化:%s", input)
	err := json.Unmarshal(input, &menu)
	if err != nil {
		logs.Error("解析json失败：%s", err, input)
		return nil
	}
	return
}

func (this *Menu) ToString() []byte {
	menu, _ := json.MarshalIndent(this, "", "")
	return menu
}

func SearhUrl(token string) string {
	return strings.Replace(MENU_SEARCH_URL, ACCESS_TOKENS, token, 1)
}
